package com.ruoyi.system.dto;

import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * 施工阶段修改DTO
 * 对应需求：施工阶段配置-阶段编辑（固定阶段/自定义阶段差异化修改权限）
 */
@Data
public class StageUpdateDTO {

    /**
     * 阶段ID（修改操作的唯一标识，必传）
     * 需求约束：
     * - 必须传递有效ID，否则无法定位修改对象
     * - 前端通过“编辑”按钮携带ID跳转，后端校验ID合法性
     */
    @NotNull(message = "阶段ID不能为空")
    private Long stageId;

    /**
     * 阶段名称（仅自定义阶段可修改，固定阶段不可修改）
     * 需求约束：
     * - 自定义阶段修改时：需非空、1-50字符，且不可与全局阶段（固定+其他自定义）重复
     * - 固定阶段修改时：该字段会被忽略（后端不处理）
     */
    @Size(min = 1, max = 50, message = "阶段名称长度需在1-50字符之间")
    private String stageName;

    /**
     * 是否必选（固定阶段/自定义阶段均支持修改）
     * 需求约束：
     * - 仅支持0（非必选）、1（必选）两个值
     * - 必选阶段：项目创建时必须勾选，不可跳过
     * - 非必选阶段：项目可根据需求灵活选择
     */
    @Range(min = 0, max = 1, message = "是否必选仅支持0（非必选）、1（必选）")
    private Integer isRequired;

    /**
     * 排序号（仅自定义阶段可修改，固定阶段排序由系统预设）
     * 需求约束：
     * - 取值范围1-999（避免极端值导致排序逻辑异常）
     * - 数值越小，阶段列表中排序越靠前
     * - 自定义阶段可通过拖拽或输入调整排序
     */
    @Range(min = 1, max = 999, message = "排序号需在1-999之间（数值越小排序越靠前）")
    private Integer sortNum;

    /**
     * 阶段状态（固定阶段/自定义阶段均支持修改，但有前置校验）
     * 需求约束：
     * - 仅支持1（启用）、2（停用）两个值
     * - 启用：阶段可关联到新项目；停用：已关联项目不受影响，新项目不可关联
     * - 前置校验：若阶段已关联项目（且项目未完成），不可停用（避免项目流程断裂）
     */
    @Range(min = 1, max = 2, message = "阶段状态仅支持1（启用）、2（停用）")
    private Integer stageStatus;

    /**
     * 备注（固定阶段/自定义阶段均支持修改，非必填）
     * 需求约束：
     * - 用于补充阶段说明（如“固定阶段：适用于所有家装项目”“自定义阶段：仅别墅外墙施工”）
     * - 最大长度500字符，避免超长文本影响存储和展示
     */
    @Size(max = 500, message = "备注最大长度为500字符")
    private String remark;
}